home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus Special 25 / AMIGAplus Sonderheft 25 (2000)(Falke)(DE)(Track 1 of 4)[!].iso / Updates / HD-Installer / jst_dev / sources / src / DiskTools / psydir.c < prev    next >
C/C++ Source or Header  |  2000-04-12  |  3KB  |  138 lines

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <signal.h>
  4.  
  5. #include <dos/dos.h>
  6. #include <proto/dos.h>
  7. #include <proto/exec.h>
  8. #include <exec/execbase.h>
  9. #include <exec/libraries.h>
  10. #include <exec/memory.h>
  11. #include <pragmas/dos_pragmas.h>
  12. #include <string.h>
  13.  
  14. #define RAWTRACK_LEN 0x8000
  15. #define TRACK_LEN 0x1800
  16. #define START_TRACK 0x2
  17. #define END_TRACK 0x2
  18.  
  19. extern struct ExecBase *SysBase;
  20.  
  21. extern APTR InitTrackDisk(ULONG);
  22. extern void ShutTrackDisk(void);
  23. extern ULONG CheckDiskIn (void);
  24.  
  25. extern ULONG ReadRawTrackIndex(ULONG,UBYTE *);
  26. extern ULONG DecodeTrack(UBYTE *, UBYTE *);
  27.  
  28. UBYTE *rawTrackBuffer=0L;
  29. UBYTE *decTrackBuffer=0L;
  30. FILE *f=0L;
  31. char *charunit="DF0:";
  32. int allocated=0,diskinit=0;
  33.  
  34. void CloseAll(char *mess)
  35.  
  36. {
  37. if (mess) printf("** %s\n",mess);
  38.  
  39. if (diskinit) ShutTrackDisk();
  40. if (allocated) Inhibit(charunit,FALSE);
  41. if (rawTrackBuffer) FreeMem((APTR)rawTrackBuffer,RAWTRACK_LEN);
  42. if (decTrackBuffer) FreeMem((APTR)decTrackBuffer,TRACK_LEN);
  43. if (f) fclose(f);
  44. exit(0);
  45. }
  46.  
  47. void BreakHandle(int code)
  48.  
  49. {
  50. CloseAll("User break");
  51. }
  52.  
  53.  
  54. main(unsigned int argc,char ** argv)
  55.  
  56.  
  57. {
  58.   ULONG diskunit;
  59.   int i,readok,retries,dcrslt;
  60.  
  61.   signal(SIGINT,BreakHandle);
  62.  
  63.   if (argc<3) {printf("PsyDir V2.1, a directory image maker by Jean-François Fabre\nUsage : psydir <unit number> <filename>\n");if (!argc) Delay(200);exit(0);}
  64.  
  65.   
  66.   diskunit=(ULONG)argv[1][0]-'0';
  67.  
  68.   if ((diskunit>3)||(diskunit<0)) {printf("** Unit %d unavailable\n",diskunit);CloseAll(0);}
  69.  
  70.   charunit[2]=diskunit+'0';
  71.  
  72.   if (SysBase->LibNode.lib_Version>36)
  73.     {
  74.     if(Inhibit(charunit,DOSTRUE)==FALSE) CloseAll("Can't allocate device !");
  75.     allocated=1;
  76.     }
  77.  
  78.   if ((ULONG)InitTrackDisk(diskunit)<0) {printf("** Can't open unit %d !",diskunit);CloseAll(0);}
  79.   diskinit=1;
  80.   if (CheckDiskIn()) {printf("** No disk in unit %d !\n",diskunit);CloseAll(NULL);}
  81.  
  82.   decTrackBuffer=(char *)AllocMem(TRACK_LEN,MEMF_CLEAR);
  83.   if (decTrackBuffer==0L) CloseAll("Can't allocate memory.");
  84.  
  85.   rawTrackBuffer=(char *)AllocMem(RAWTRACK_LEN,MEMF_CHIP|MEMF_CLEAR);
  86.   if (rawTrackBuffer==0L) CloseAll("Can't allocate chip memory.");
  87.  
  88.   printf("Reading disk data...\n");
  89.  
  90.   f=fopen(argv[2],"wb");
  91.  
  92.   if (f==0L) {printf("Can't create file !\n");CloseAll(0);}
  93.  
  94.   for (i=START_TRACK;i<END_TRACK+1;i++)
  95.     {
  96.     retries=0;
  97.     readok=0;
  98.  
  99.         do
  100.         {
  101.              if (ReadRawTrackIndex(i,rawTrackBuffer))
  102.             {
  103.                 if (retries>2) CloseAll("Low level disk read error!");
  104.             }
  105.  
  106.              else
  107.              {
  108.                  dcrslt=DecodeTrack(rawTrackBuffer,decTrackBuffer);
  109.  
  110.                  if (!dcrslt)
  111.                     {
  112.                         if (fwrite(decTrackBuffer,1,0x1000,f)!=0x1000) CloseAll("Disk full !");
  113.                         readok=1;    /* OK, next track */
  114.                     }
  115.                 else
  116.                     {
  117.                         if (retries>2)
  118.  
  119.                             switch(dcrslt)
  120.                             {    
  121.                             case -1: printf("** Error Track %d\n",i);CloseAll("Decode disk read error!");
  122.                             default: printf("** Error Track %d\n",i);CloseAll("No sync found!");
  123.                             }
  124.                     }
  125.  
  126.              }
  127.  
  128.     retries++;
  129.     }
  130.     while (!readok);
  131.  
  132.  
  133.     }
  134.  
  135.  
  136.   CloseAll(NULL);
  137. }
  138.